const TokenType = Object.freeze({
    // 字符串
    string: 'string',
    // 数字
    number: 'number',
    // 布尔值
    boolean: 'boolean',
    // null
    null: 'null',
    // 自动类型
    auto: 'auto',
    // 左花括号
    braceLeft: 'braceLeft',
    // 右花括号
    braceRight: 'braceRight',
    // 左方括号
    bracketLeft: 'bracketLeft',
    // 右方括号
    bracketRight: 'bracketRight',
    // 逗号
    comma: 'comma',
    // 冒号
    colon: 'colon',
    // 关键字
    keyword: 'keyword'
})


class Token {
    constructor(value, type) {
        this.setup(value, type)
    }
    setup(value, type) {
        this.value = value
        this.type = type
        this.autoType()
    }
    autoType() {
        const types = {
            '[': TokenType.bracketLeft,
            ']': TokenType.bracketRight,
            '{': TokenType.braceLeft,
            '}': TokenType.braceRight,
            ',': TokenType.comma,
            ':': TokenType.colon,
            'null': TokenType.null,
            'false': TokenType.boolean,
            'true': TokenType.boolean,
        }
        if (this.type === TokenType.auto || this.type === TokenType.keyword) {
            this.type = types[this.value]
        }
    }
}

module.exports = {
    TokenType,
    Token,
}